package clienteWeb;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import interfaz.InterfazRestaurante;

import beans.ComandaBean;
import beans.ItemComandaBean;
import beans.MedioPagoBean;
import beans.MesaBean;
import beans.MozoBean;
import beans.PlatoBean;
import beans.RestauranteBean;

public class ControladorWeb {
	private static ControladorWeb instancia;
	private static String hostname = "localhost";
	private ComandaBean tmpComanda;
	InterfazRestaurante rmiController;

	public static void main(String[] args)
	{
		new ControladorWeb();
	}

	public static ControladorWeb getInstancia(){
		if (instancia==null){
			instancia = new ControladorWeb();
		}
		return instancia;
	}

	private ControladorWeb(){
		instancia = this;
		getStub();		
	}

	private boolean getStub() {
		try {
//			rmiController = (InterfazRestaurante)Naming.lookup ("//localhost/RestauranteRMI");
			rmiController = (InterfazRestaurante)Naming.lookup ("//localhost/RestauranteRMI");
			
			System.out.println("Me pude conectar al server");
			
//			this.getPlatos();
			
			return true;
		} catch (Exception e) {
			System.out.println("No me puedo conectar al server");
			JOptionPane.showMessageDialog(null, "Error no me puedo conectar al server \n "+"//"+hostname+"/RestauranteRMI");
		}
		return false;
	}
	
	public List<RestauranteBean> getRestaurantes(){
		try {
			return rmiController.getRestaurantes();			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}	
	
	public List<MozoBean> getMozos(Integer restaurante){
		try {
			return rmiController.getMozosDeRestaurante(restaurante);			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}	
	
	public List<MesaBean> getMesasPorEstado(String estado){
		try {
			return rmiController.getMesasPorEstado(estado);			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
	public List<MesaBean> getMesasDeMozo(Integer legajo){
		try {
			return rmiController.getMesasDeMozo(legajo);			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
	public List<MedioPagoBean> getMediosPago(){
		try {
			return rmiController.getMediosPago();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
	public void liberarMesa(Integer numeroRestaurante, Integer numeroMesa){
		try {
//			rmiController.liberarMesa(numeroRestaurante, numeroMesa);
			rmiController.liberarMesa(numeroRestaurante, numeroMesa);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void crearComanda(Integer numeroMesa){
		tmpComanda = new ComandaBean();
		MesaBean m = new MesaBean();
		m.setNumero(numeroMesa);
		tmpComanda.setMesa(m);
		
		System.out.println("se creo la comanda");
		
	}
	
	public void agregarItemComandaActual(Integer idPlato, Integer cantidad) {
		ItemComandaBean i = new ItemComandaBean();
		PlatoBean p = new PlatoBean();
		p.setIdPlato(idPlato);
		i.setCantidad(cantidad);
		i.setPlato(p);
		if(this.tmpComanda.getItemsComanda() == null)
			this.tmpComanda.setItemsComanda(new LinkedList<ItemComandaBean>());
		this.tmpComanda.getItemsComanda().add(i);
	}

	public void generarComanda() {
		try {
			rmiController.generarComandas(this.tmpComanda.getMesa().getNumero(), this.tmpComanda.getItemsComanda());
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	

	
	public void abrirMesa(Integer legajo, Integer numeroMesa, Integer cantComensales){
		try {
			rmiController.registrarAperturaMesa(legajo, numeroMesa, cantComensales);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public Float getImporteAFacturar(Integer restaurante, Integer mesa){
		try {
			return rmiController.calcularTotalMesa(restaurante, mesa);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return (float) 0;
		}
	}
	
	public void generarFactura(Integer mesa, Integer medioPago){
		try {
			rmiController.generarFactura(mesa, medioPago);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();			
		}
	}

	public void cerrarMesa(Integer numeroRestaurante, Integer numeroMesa) {
		// TODO Auto-generated method stub
		try {
			rmiController.cerrarMesa(numeroRestaurante, numeroMesa);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	public Float calcularTotalMesa(Integer numeroRestaurante, Integer numeroMesa) {
		Float total = new Float(0);
		// TODO Auto-generated method stub
		try {
			total = rmiController.calcularTotalMesa(numeroRestaurante, numeroMesa);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return total;
	}

}
